﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Common;
using System.Globalization;

namespace Sinacor.Process.Bovespa.Negocio.Server.ProcessLogic.Translator.LayoutToProcessEntity
{
    public class Negocio
    {
        public ProcessEntity.NegocioHeader ToNegocioHeader(Layout.NegocioHeader from)
        {
            ProcessEntity.NegocioHeader to = null;

            if (from != null)
            {
                to = new ProcessEntity.NegocioHeader();

                to.CodigoArquivo = from.CodigoArquivo;
                to.CodigoDestino = from.CodigoDestino;
                to.CodigoOrigem = from.CodigoOrigem;
                to.CodigoUsuario = from.CodigoUsuario;
                to.DataGeracao = from.DataGeracao;
                to.DataPregao = from.DataPregao;
                to.Reserva = from.Reserva;
                to.TipoRegistro = from.TipoRegistro;
            }

            return to;
        }

        public List<ProcessEntity.NegocioHeader> ToNegocioHeader(List<Layout.NegocioHeader> from)
        {
            List<ProcessEntity.NegocioHeader> to = null;

            if (from != null)
            {
                to = new List<ProcessEntity.NegocioHeader>();

                foreach (Layout.NegocioHeader item in from)
                {
                    to.Add(ToNegocioHeader(item));
                }
            }

            return to;
        }

        public ProcessEntity.NegocioTrailer ToNegocioTrailer(Layout.NegocioTrailer from)
        {
            ProcessEntity.NegocioTrailer to = null;

            if (from != null)
            {
                to = new ProcessEntity.NegocioTrailer();

                to.CodigoArquivo = from.CodigoArquivo;
                to.CodigoDestino = from.CodigoDestino;
                to.CodigoOrigem = from.CodigoOrigem;
                to.CodigoUsuario = from.CodigoUsuario;
                to.DataGeracao = from.DataGeracao;
                to.Reserva = from.Reserva;
                to.TipoRegistro = from.TipoRegistro;
                to.TotalRegistrosGerados = from.TotalRegistrosGerados;
            }

            return to;
        }

        public List<ProcessEntity.NegocioTrailer> ToNegocioHeader(List<Layout.NegocioTrailer> from)
        {
            List<ProcessEntity.NegocioTrailer> to = null;

            if (from != null)
            {
                to = new List<ProcessEntity.NegocioTrailer>();

                foreach (Layout.NegocioTrailer item in from)
                {
                    to.Add(ToNegocioTrailer(item));
                }
            }

            return to;
        }

        public ProcessEntity.NegocioRDetail ToNegocioRDetail(Layout.NegocioRDetail from)
        {
            ProcessEntity.NegocioRDetail to = null;

            if (from != null)
            {
                to = new ProcessEntity.NegocioRDetail();

                to.BolsaNegocio = from.BolsaNegocio;
                to.CodigoCliente = from.CodigoCliente;
                to.CodigoISIN = from.CodigoISIN;
                to.CodigoNegociacao = from.CodigoNegociacao;
                to.CodigoObjetoPapel = from.CodigoObjetoPapel;
                to.CodigoTerminalOperador = from.CodigoTerminalOperador;
                to.CodigoTipoTermo = from.CodigoTipoTermo;
                to.CodigoUsuarioContraParte = from.CodigoUsuarioContraParte;
                to.DataVencimento = from.DataVencimento;
                to.DigitoCliente = from.DigitoCliente;
                to.DistribuicaoISIN = from.DistribuicaoISIN;
                to.Especificacao = from.Especificacao;
                to.FatorCotacaoNegocio = from.FatorCotacaoNegocio;

                switch (from.FormaLiquidacao)
                {
                    case Layout.Enum.FormaLiquidacao.Bruto:
                        to.FormaLiquidacao = ProcessEntity.Enum.FormaLiquidacao.Bruto;
                        break;
                    case Layout.Enum.FormaLiquidacao.Liquido:
                        to.FormaLiquidacao = ProcessEntity.Enum.FormaLiquidacao.Liquido;
                        break;
                }

                to.HoraMinutoNegocio = from.HoraMinutoNegocio;
                to.IndicadorAfterMarketing = from.IndicadorAfterMarketing;
                to.IndicadorOrigemOferta = from.IndicadorOrigemOferta;

                switch (from.NaturezaOperacao)
                {
                    case Layout.Enum.NaturezaOperacao.C:
                        to.NaturezaOperacao = ProcessEntity.Enum.NaturezaOperacao.Compra;
                        break;
                    case Layout.Enum.NaturezaOperacao.V:
                        to.NaturezaOperacao = ProcessEntity.Enum.NaturezaOperacao.Venda;
                        break;
                }

                to.NomeSociedadeEmissora = from.NomeSociedadeEmissora;
                to.NumeroNegociosPorCodigoNegociacao = from.NumeroNegociosPorCodigoNegociacao;
                to.PrazoLiquidacao = from.PrazoLiquidacao;
                to.PrazoVencimentoAntigo = from.PrazoVencimentoAntigo;
                to.PrazoVencimentoNovo = from.PrazoVencimentoNovo;
                to.PrecoExercicioSerie = from.PrecoExercicioSerie;
                to.PrecoNegocio = from.PrecoNegocio;
                to.QuantidadeNegocio = from.QuantidadeNegocio;
                to.Reserva = from.Reserva;
                to.SituacaoNegocio = from.SituacaoNegocio;
                to.TipoLiquidacao = from.TipoLiquidacao;

                switch (from.TipoMercado)
                {
                    case Layout.Enum.TipoMercado.VIS:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Vista;
                        break;
                    case Layout.Enum.TipoMercado.EOC:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.ExercicioOpcaoCompra;
                        break;
                    case Layout.Enum.TipoMercado.EOV:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.ExercicioOpcaoVenda;
                        break;
                    case Layout.Enum.TipoMercado.LNC:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.LeilaoTitulosNaoCotados;
                        break;
                    case Layout.Enum.TipoMercado.LEI:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Leilao;
                        break;
                    case Layout.Enum.TipoMercado.FRA:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Fracionario;
                        break;
                    case Layout.Enum.TipoMercado.TER:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Termo;
                        break;
                    case Layout.Enum.TipoMercado.OPC:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.OpcoesCompra;
                        break;
                    case Layout.Enum.TipoMercado.OPV:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.OpcoesVenda;
                        break;
                }

                to.TipoRegistro = from.TipoRegistro;

                switch (from.TipoTransacao)
                {
                    case Layout.Enum.TipoTransacao.NOR:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.Normal;
                        break;
                    case Layout.Enum.TipoTransacao.DIR:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.Direto;
                        break;
                    case Layout.Enum.TipoTransacao.NOC:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.NegocioOfertaCompra;
                        break;
                    case Layout.Enum.TipoTransacao.NOV:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.NegocioOfertaVenda;
                        break;
                }
            }

            return to;
        }

        public List<ProcessEntity.NegocioRDetail> ToNegocioRDetail(List<Layout.NegocioRDetail> from)
        {
            List<ProcessEntity.NegocioRDetail> to = null;

            if (from != null)
            {
                to = new List<ProcessEntity.NegocioRDetail>();

                foreach (Layout.NegocioRDetail item in from)
                {
                    to.Add(ToNegocioRDetail(item));
                }
            }

            return to;
        }

        public ProcessEntity.NegocioSDetail ToNegocioSDetail(Layout.NegocioSDetail from)
        {
            ProcessEntity.NegocioSDetail to = null;

            if (from != null)
            {
                to = new ProcessEntity.NegocioSDetail();

                switch (from.BolsaMovimento)
                {
                    case Layout.Enum.TipoBolsaMovimento.Bovespa:
                        to.BolsaMovimento = ProcessEntity.Enum.TipoBolsaMovimento.Bovespa;
                        break;
                    case Layout.Enum.TipoBolsaMovimento.Soma:
                        to.BolsaMovimento = ProcessEntity.Enum.TipoBolsaMovimento.Soma;
                        break;
                }

                to.BolsaNegocio = from.BolsaNegocio;
                to.CodigoCliente = from.CodigoCliente;
                to.CodigoISIN = from.CodigoISIN;
                to.CodigoNegociacao = from.CodigoNegociacao;
                to.CodigoObjetoPapel = from.CodigoObjetoPapel;
                to.CodigoUsuarioContraParte = from.CodigoUsuarioContraParte;
                to.DigitoCliente = from.DigitoCliente;
                to.DistribuicaoISIN = from.DistribuicaoISIN;
                to.Especificacao = from.Especificacao;
                to.FatorCotacaoNegocio = from.FatorCotacaoNegocio;

                switch (from.FormaLiquidacao)
                {
                    case Layout.Enum.FormaLiquidacao.Bruto:
                        to.FormaLiquidacao = ProcessEntity.Enum.FormaLiquidacao.Bruto;
                        break;
                    case Layout.Enum.FormaLiquidacao.Liquido:
                        to.FormaLiquidacao = ProcessEntity.Enum.FormaLiquidacao.Liquido;
                        break;
                }

                to.HoraMinutoNegocio = from.HoraMinutoNegocio;
                to.IndicadorAfterMarketing = from.IndicadorAfterMarketing;

                switch (from.NaturezaOperacao)
                {
                    case Layout.Enum.NaturezaOperacao.C:
                        to.NaturezaOperacao = ProcessEntity.Enum.NaturezaOperacao.Compra;
                        break;
                    case Layout.Enum.NaturezaOperacao.V:
                        to.NaturezaOperacao = ProcessEntity.Enum.NaturezaOperacao.Venda;
                        break;
                }

                to.NomeSociedadeEmissora = from.NomeSociedadeEmissora;
                to.NumeroNegociosPorCodigoNegociacao = from.NumeroNegociosPorCodigoNegociacao;
                to.PrazoLiquidacao = from.PrazoLiquidacao;
                to.PrazoVencimentoAntigo = from.PrazoVencimentoAntigo;
                to.PrazoVencimentoNovo = from.PrazoVencimentoNovo;
                to.PrecoExercicioSerie = from.PrecoExercicioSerie;
                to.PrecoNegocio = from.PrecoNegocio;
                to.QuantidadeNegocio = from.QuantidadeNegocio;
                to.Reserva = from.Reserva;
                to.Reserva2 = from.Reserva2;
                to.Reserva3 = from.Reserva3;
                to.SituacaoNegocio = from.SituacaoNegocio;
                to.TipoLiquidacao = from.TipoLiquidacao;

                switch (from.TipoMercado)
                {
                    case Layout.Enum.TipoMercado.VIS:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Vista;
                        break;
                    case Layout.Enum.TipoMercado.EOC:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.ExercicioOpcaoCompra;
                        break;
                    case Layout.Enum.TipoMercado.EOV:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.ExercicioOpcaoVenda;
                        break;
                    case Layout.Enum.TipoMercado.LNC:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.LeilaoTitulosNaoCotados;
                        break;
                    case Layout.Enum.TipoMercado.LEI:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Leilao;
                        break;
                    case Layout.Enum.TipoMercado.FRA:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Fracionario;
                        break;
                    case Layout.Enum.TipoMercado.TER:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.Termo;
                        break;
                    case Layout.Enum.TipoMercado.OPC:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.OpcoesCompra;
                        break;
                    case Layout.Enum.TipoMercado.OPV:
                        to.TipoMercado = ProcessEntity.Enum.TipoMercado.OpcoesVenda;
                        break;
                }

                to.TipoOperacaoRecompra = from.TipoOperacaoRecompra;
                to.TipoRegistro = from.TipoRegistro;

                switch (from.TipoTransacao)
                {
                    case Layout.Enum.TipoTransacao.NOR:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.Normal;
                        break;
                    case Layout.Enum.TipoTransacao.DIR:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.Direto;
                        break;
                    case Layout.Enum.TipoTransacao.NOC:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.NegocioOfertaCompra;
                        break;
                    case Layout.Enum.TipoTransacao.NOV:
                        to.TipoTransacao = ProcessEntity.Enum.TipoTransacao.NegocioOfertaVenda;
                        break;
                }
            }

            return to;
        }

        public List<ProcessEntity.NegocioSDetail> ToNegocioSDetail(List<Layout.NegocioSDetail> from)
        {
            List<ProcessEntity.NegocioSDetail> to = null;

            if (from != null)
            {
                to = new List<ProcessEntity.NegocioSDetail>();

                foreach (Layout.NegocioSDetail item in from)
                {
                    to.Add(ToNegocioSDetail(item));
                }
            }

            return to;
        }

        public ProcessEntity.NegocioHeader ToNegocioHeader(Layout.NegocioXMLIdentificador from)
        {
            ProcessEntity.NegocioHeader to = null;

            if (from != null)
            {
                to = new ProcessEntity.NegocioHeader();

                to.CodigoArquivo = from.CodigoArquivo;
                to.CodigoUsuario = from.CodigoUsuario;
                to.DataGeracao = DateTime.ParseExact(from.DataGeracao, "dd/MM/yyyy HH:mm:ss",null);

                if (from.Evento != null)
                    to.DataPregao = DateTime.ParseExact(from.Evento.DataPregao, "dd/MM/yyyy", null);
            }

            return to;
        }

        public ProcessEntity.NegocioTrailer ToNegocioTrailer(Layout.NegocioXMLIdentificador from)
        {
            ProcessEntity.NegocioTrailer to = null;

            if (from != null)
            {
                to = new ProcessEntity.NegocioTrailer();

                to.CodigoArquivo = from.CodigoArquivo;
                to.CodigoUsuario = from.CodigoUsuario;
                to.DataGeracao = DateTime.ParseExact(from.DataGeracao, "dd/MM/yyyy HH:mm:ss", null);
            }

            return to;
        }

        public List<ProcessEntity.NegocioSDetail> ToNegocioSDetail(List<Layout.NegocioXMLNegocio> from)
        {
            List<ProcessEntity.NegocioSDetail> to = null;

            if (from != null)
            {
                to = new List<ProcessEntity.NegocioSDetail>();

                foreach (Layout.NegocioXMLNegocio item in from)
                {
                    to.Add(ToNegocioSDetail(item));
                }
            }

            return to;
        }

        public ProcessEntity.NegocioSDetail ToNegocioSDetail(Layout.NegocioXMLNegocio from)
        {
            ProcessEntity.NegocioSDetail to = null;

            if (from != null)
            {
                to = new ProcessEntity.NegocioSDetail();

                to.BolsaMovimento = (ProcessEntity.Enum.TipoBolsaMovimento)EnumConverter.Parse(typeof(ProcessEntity.Enum.TipoBolsaMovimento), from.BolsaMovimento);
                
                if (!String.IsNullOrEmpty(from.Cliente))
                {
                    to.CodigoCliente = Convert.ToInt32(from.Cliente.Split('-')[0]);
                    to.DigitoCliente = Convert.ToInt32(from.Cliente.Split('-')[1]);
                }

                to.CodigoISIN = from.CodigoISIN;
                to.CodigoNegociacao = from.CodigoNegociacao;
                to.CodigoObjetoPapel = from.CodigoObjetoPapel;
                to.CodigoUsuarioContraParte = from.CodigoUsuarioContraParte;
                to.DistribuicaoISIN = from.DistribuicaoISIN;
                to.Especificacao = from.Especificacao;
                to.FatorCotacaoNegocio = from.FatorCotacaoNegocio;

                to.FormaLiquidacao = (ProcessEntity.Enum.FormaLiquidacao)EnumConverter.Parse(typeof(ProcessEntity.Enum.FormaLiquidacao), from.FormaLiquidacao);

                to.HoraMinutoNegocio = from.HoraMinutoNegocio;
                to.IndicadorAfterMarketing = from.IndicadorAfterMarketing;

                to.NaturezaOperacao = (ProcessEntity.Enum.NaturezaOperacao)EnumConverter.Parse(typeof(ProcessEntity.Enum.NaturezaOperacao), from.NaturezaOperacao);

                to.NomeSociedadeEmissora = from.NomeSociedadeEmissora;
                to.NumeroNegociosPorCodigoNegociacao = from.NumeroNegociosPorCodigoNegociacao;
                to.PrazoLiquidacao = from.PrazoLiquidacao;
                to.PrazoVencimentoNovo = from.PrazoVencimentoNovo;

                if (!String.IsNullOrEmpty(from.PrecoExercicioSerie))
                {
                    to.PrecoExercicioSerie = Convert.ToDecimal(from.PrecoExercicioSerie);
                }

                to.PrecoNegocio = from.PrecoNegocio;
                to.QuantidadeNegocio = from.QuantidadeNegocio;

                to.TipoMercado = (ProcessEntity.Enum.TipoMercado)EnumConverter.Parse(typeof(ProcessEntity.Enum.TipoMercado), from.TipoMercado);

                to.TipoOperacaoRecompra = "N";

                to.TipoTransacao = (ProcessEntity.Enum.TipoTransacao)EnumConverter.Parse(typeof(ProcessEntity.Enum.TipoTransacao), from.TipoTransacao);
            }

            return to;
        }
    }
}
